home *** CD-ROM | disk | FTP | other *** search
/ AMIGA-CD 2 / Amiga-CD - Volume 2.iso / ungepackte_daten / 1995 / 6 / 02 / c++-kurs / findfile.c < prev    next >
C/C++ Source or Header  |  1995-06-01  |  12KB  |  345 lines

  1. // $VER: FindFile.c -- AmigaDOS V1 (17.3.95); ©CM 95 
  2. // komplettes FindFile mit EasyObjects, startbar von WB und Shell
  3. // Shell-Syntax: FindFile [Pattern] [Strt-Dir]
  4.  
  5. #include <dos/dos.h>
  6. #include <dos/dosextens.h>
  7. #include <classes/dos/arguments.h>
  8. #include <classes/dos/files.h>
  9. #include <classes/libraries/gadtools.h>
  10. #include <classes/intuition/screen.h>
  11. #include <classes/intuition/gadgets.h>
  12. #include <classes/layouter/windows.h>
  13. #include <classes/layouter/boopsigadgets.h>
  14. #include <classes/layouter/decorgadgets.h>
  15. #include <classes/exec/libraries.h>
  16. #include <stream.h>
  17. #include <time.h>
  18. #include <wbstartup.h>
  19. #include "DirTree.h"
  20.  
  21. // Hier folgt erstmal die FindFile-Klasse unter DOS
  22.    
  23. class FindFileDOS : public DirTree  {
  24.    BOOL dirout; 
  25.    int dircnt, filecnt;
  26. public:
  27.    FindFileDOS(char*dir, char*pat) : DirTree(dir, pat),
  28.       dirout(FALSE), dircnt(0), filecnt(0)  {}
  29.    void Error(const char*error) {
  30.       cout << "Fehler: "<< error << "\n";
  31.    }
  32.    void FileFound(const ExAllData*ead) { // Namen ausgeben
  33.       if(dirout) { cout << "\n"; dirout=0;   } // nur zur
  34.       cout<<" fnd: "<<(char*)(ead->ed_Name)<<'\n'; // Formatierung
  35.       filecnt++;
  36.    }
  37.    void DirChanged(const char*dir) {
  38.       cout<<dir<<"\x9b\x4b\r";
  39.       dirout=1;   // zur richtigen Formatierung
  40.       dircnt++;   // für die Statistik
  41.    }
  42.  
  43.    void Finish() { 
  44.       if(dirout) { cout << "\x9b\x4b"; }
  45.       cout << "\nVerzeichnisse:    "<<dircnt<<"\n"
  46.                 "Dateien gefunden: "<<filecnt<<"\n";
  47.    }
  48. };
  49.  
  50. // der Rest bezieht sich auf die GUI-Version
  51.  
  52. class FindFileGUI;
  53. class FFGUIWindow;
  54.  
  55. // Event-Handler
  56.  
  57. class startEventC : public GadgetEventC {
  58. public:
  59.    startEventC() : GadgetEventC(), _exit(FALSE) { };
  60.    VOID up(WindowC *, GadgetC *, IntuiMessageC *);
  61.    VOID down(WindowC *, GadgetC *, IntuiMessageC *);
  62.    VOID keyUp(WindowC *, GadgetC *, IntuiMessageC *);
  63.    BOOL exit() { return _exit; };
  64. protected:
  65.    BOOL _exit;
  66. };
  67.  
  68. class exitEventC : public GadgetEventC {
  69. public:
  70.    exitEventC() : GadgetEventC(), _exit(FALSE) { };
  71.    VOID up(WindowC *, GadgetC *, IntuiMessageC * );
  72.    VOID down(WindowC *, GadgetC *, IntuiMessageC *);
  73.    VOID keyUp(WindowC *, GadgetC *, IntuiMessageC *);
  74.    BOOL exit() { return _exit; };
  75. protected:
  76.    BOOL _exit;
  77. };
  78.  
  79. class SelectWindowCloseC : public WindowCloseHandlerC {
  80. public:
  81.    SelectWindowCloseC(class FFGUIWindow &);
  82.    VOID close();
  83. private:
  84.    class FFGUIWindow &ffwin;
  85. };
  86.  
  87. // Hauptfenster
  88.  
  89. class FFGUIWindow : public StandardWindowC {
  90.    LBStringC   STpattern;        GeometryC      GESTpattern;
  91.    LBStringC   STpath;           GeometryC      GESTpath;
  92.    LBListviewC LVfoundfiles;     GeometryC      GELVfoundfiles;
  93.                         TransparentGroupLayoutC TGcontrolbuttons;
  94.                                  GeometryGroupC GGcontrolbuttons;
  95.    LBIButtonC  BUstart;          GeometryC      GEBUstart;
  96.    LBIButtonC  BUexit;           GeometryC      GEBUexit;
  97.    EListC *LSfoundfiles;
  98.    GadgetKeyHandlerC GKEhandler;
  99.    LBTextC TXremark;             GeometryC      GETXremark;               
  100.  
  101.    FindFileGUI *ffg;
  102.    startEventC EVstart;
  103.    exitEventC  EVexit;
  104.    EListC filelist;
  105.    BOOL started, stopped, exited;
  106.    SelectWindowCloseC swc;
  107.    friend class FindFileGUI;
  108.    char *dir;
  109. public:
  110.    FFGUIWindow(GTIDCMPortC&, ScreenC&);
  111.    ~FFGUIWindow();
  112.    BOOL start(), exit();
  113.    void SetRemark(char*);  
  114. };
  115.  
  116. class FindFileGUI : public DirTree  {
  117.    int dircnt, filecnt; // Statistik
  118.    FFGUIWindow &ffwin;  // zur Bildschirmausgabe (friend)
  119.    PathStringC path;    // zur Ausgabe
  120.    time_t stime;        // Statistik
  121. public:
  122.    FindFileGUI(char*dir, char*pat, FFGUIWindow&w) : 
  123.       DirTree(dir, pat),
  124.               dircnt(0), filecnt(0), ffwin(w), path(256)  {}
  125.    void Error(const char*error);
  126.    void Init();
  127.    void FileFound(const ExAllData*ead);
  128.    void DirChanged(const char*dir);
  129.    void Finish();
  130. };
  131.  
  132. // Window-Routinen
  133.  
  134. FFGUIWindow::FFGUIWindow(GTIDCMPortC&g, ScreenC&s) : 
  135.    StandardWindowC(g,s, &BUstart, 
  136.       WA_MaxWidth, ~0,           WA_MaxHeight, ~0, 
  137.       WA_Width, 640,             WA_Height, 200, 
  138.       WA_SizeBBottom, FALSE,     WA_SizeBRight, TRUE, 
  139.       WA_Title, "FindFile 1.0 - © Clemens Marschner 1995", 
  140.       WA_Activate, TRUE, TAG_END), 
  141.    filelist(),
  142.    STpattern(NULL, *this,LAYOUT_AUTOSIZE,LAYOUT_AUTOSIZE, 
  143.                         GA_Text, "Pattern:", 
  144.                         STRINGA_MaxChars, 256,
  145.                         STRINGA_ActivePens, ((3 << 16) | 1), 
  146.                         GA_TabCycle, TRUE, TAG_END),           
  147.    STpath(NULL, *this, LAYOUT_AUTOSIZE, LAYOUT_AUTOSIZE,
  148.                         GA_Text, "   Pfad:",
  149.                         STRINGA_MaxChars, 256, 
  150.                         STRINGA_ActivePens, ((3 << 16) | 1), 
  151.                         GA_TabCycle, TRUE, TAG_END),
  152.    LVfoundfiles(NULL, *this, LAYOUT_AUTOSIZE, LAYOUT_AUTOSIZE,
  153.                         LVA_VertScroller, TRUE,
  154.                         LVA_HorizScroller, TRUE, TAG_END),
  155.    TGcontrolbuttons(),
  156.    EVstart(), 
  157.    BUstart(&EVstart, *this, LAYOUT_AUTOSIZE,  LAYOUT_AUTOSIZE,
  158.                         GA_Text, "_Start", 
  159.                         GA_RelVerify,TRUE,   TAG_END),
  160.    EVexit(), 
  161.    BUexit(&EVexit, *this, LAYOUT_AUTOSIZE, LAYOUT_AUTOSIZE,
  162.                         GA_Text, "_Beenden", 
  163.                         GA_RelVerify,TRUE,   TAG_END),
  164.    TXremark(NULL, *this, LAYOUT_AUTOSIZE, LAYOUT_AUTOSIZE,
  165.                TAG_END),
  166.    GESTpattern(STpattern, 
  167.       LAYOUT_GROUP,  0,3,                 LAYOUT_SIZE, 0, 0,
  168.       LAYOUT_GROUP,  0,4,                 LAYOUT_GROUP, 0, -4),
  169.    GESTpath(STpath, 
  170.       LAYOUT_OPPBORDER, &GESTpattern, 3,  LAYOUT_SIZE, 0, 0,
  171.       LAYOUT_GROUP,  0,4,                 LAYOUT_GROUP, 0,-4),
  172.    GELVfoundfiles(LVfoundfiles, 
  173.       LAYOUT_OPPBORDER, &GESTpath, 4,     
  174.       LAYOUT_OPPBORDER, &GGcontrolbuttons, -4,
  175.       LAYOUT_GROUP,  0,0,                 LAYOUT_GROUP, 0,0),
  176.    GGcontrolbuttons(TGcontrolbuttons, 
  177.       LAYOUT_SIZE,   0,4,      LAYOUT_OPPBORDER, &GETXremark,-4,
  178.       LAYOUT_GROUP,  0,0,                 LAYOUT_GROUP, 0,0),
  179.    GEBUstart(BUstart, 
  180.       LAYOUT_SIZE,   0,0,                 LAYOUT_GROUP, 0, 0, 
  181.       LAYOUT_PROCENTCENTER, 0, 33,        LAYOUT_MAXSIZE, 0, 0),
  182.    GEBUexit(BUexit, 
  183.       LAYOUT_SIZE,   0,0,                 LAYOUT_GROUP, 0,0,   
  184.       LAYOUT_PROCENTCENTER, 0, 66,        LAYOUT_MAXSIZE, 0,0),
  185.    GETXremark(TXremark, 
  186.       LAYOUT_SIZE,   0,0,                 LAYOUT_GROUP, 0,0,
  187.       LAYOUT_GROUP,  0,0,                 LAYOUT_GROUP, 0,0) ,
  188.    swc(*this), started(FALSE), stopped(FALSE), GKEhandler(*this)
  189. {
  190.       dir = new char[256];
  191.       gadgets.add(STpattern); // Gadgets in die Hauptliste
  192.       gadgets.add(STpath);      gadgets.add(LVfoundfiles);
  193.       gadgets.add(BUstart);     gadgets.add(BUexit);
  194.       gadgets.add(TXremark);
  195.       innerGeo.add(GESTpattern);    // Geometrien in die Liste
  196.       innerGeo.add(GESTpath);   innerGeo.add(GELVfoundfiles);
  197.       innerGeo.add(GETXremark);
  198.       innerGeo.add(GGcontrolbuttons);  // das ist eine Gruppe...
  199.       GGcontrolbuttons.add(GEBUstart); // in die ebenfalls Gad-
  200.       GGcontrolbuttons.add(GEBUexit);  // gets eingehängt werden
  201.  
  202.       LVfoundfiles.setList(&filelist);       // Liste für Listview
  203.       GKEhandler.add("rcommand s", BUstart); // Tastatur-Shortcut
  204.       GKEhandler.add("rcommand b", BUexit);  
  205. }
  206.  
  207. FFGUIWindow::~FFGUIWindow()
  208. {  close();  delete dir; }
  209.  
  210. BOOL FFGUIWindow::start() {
  211.    if(!started) { // Nur beginnen, falls noch nicht gestartet:
  212.       started=TRUE;   stopped=FALSE;
  213.       char *path    = STpath.get();       // Strings einlesen
  214.       char *pattern = STpattern.get(); //
  215.       LVfoundfiles.detachList();         // Liste leeren
  216.       while (!filelist.isEmpty())
  217.       {  delete filelist.remTail();  }
  218.       LVfoundfiles.attachList();
  219.       FindFileGUI ffg(path, pattern, *this); // Klasse init.
  220.       ffg.ReadRecursively();                 // und benutzen
  221.    }
  222.    return FALSE;
  223. }
  224.    
  225. BOOL FFGUIWindow::exit()
  226. {  stopped = TRUE; return TRUE; }
  227.  
  228. void FFGUIWindow::SetRemark(char*rem)
  229. {   TXremark.set(rem); }
  230.  
  231. void FindFileGUI::Init()
  232. {  ffwin.LVfoundfiles.detachList(); stime = time(0); }
  233.  
  234. void FindFileGUI::Error(const char*error)
  235. {   ffwin.SetRemark((char*)error); }
  236.  
  237. void FindFileGUI::FileFound(const ExAllData*ead) {
  238.    ENodeC *node = new ENodeC();
  239.    char *file = new char[128];
  240.    char date[LEN_DATSTRING],time[LEN_DATSTRING],prot[8]; 
  241.    struct DateTime dt = {
  242.          ead->ed_Days,ead->ed_Mins,ead->ed_Ticks,
  243.          FORMAT_DOS, 0, NULL, date, time
  244.    };
  245.    path.addPart(ead->ed_Name); // pathstringc
  246.    DateToStr(&dt);
  247.    prot[7]='\0';
  248.    prot[0]= ead->ed_Prot & FIBF_SCRIPT       ? 's' : '-';
  249.    prot[1]= ead->ed_Prot & FIBF_PURE         ? 'p' : '-';
  250.    prot[2]= ead->ed_Prot & FIBF_ARCHIVE      ? 'a' : '-';
  251.    prot[3]= (!(ead->ed_Prot & FIBF_READ))    ? 'r' : '-';
  252.    prot[4]= (!(ead->ed_Prot & FIBF_WRITE))   ? 'w' : '-';
  253.    prot[5]= (!(ead->ed_Prot & FIBF_EXECUTE)) ? 'e' : '-';
  254.    prot[6]= (!(ead->ed_Prot & FIBF_DELETE))  ? 'd' : '-';
  255.    sprintf(file, "%9s %9s %7s %10d %-32s", date, time, prot,
  256.                  ead->ed_Size,path.path());
  257.    // höchstens 70 Zeichen
  258.    node->setName(file); 
  259.    // und ausgeben
  260.    ffwin.filelist.addTail(*node);
  261.    filecnt++;
  262.    path.cutBehindPathPart(); 
  263.    if(ffwin.stopped) running=FALSE;
  264. }
  265.  
  266. void FindFileGUI::DirChanged(const char*dir) {
  267.    path.setPath((char*)dir);
  268.    ffwin.SetRemark((char*)dir);
  269.    if(ffwin.idcmPort().forMe(0)) 
  270.       (ffwin.idcmPort()).handle(0);
  271.    if(ffwin.stopped) running = FALSE;
  272.    dircnt++;
  273. }
  274.  
  275. void FindFileGUI::Finish() {
  276.    char buf[128];
  277.    time_t etime = time(0);
  278.    sprintf(buf, "Verzeichnisse: %d; Gefundene Dateien: %d; "
  279.     "Zeit: %d s", dircnt, filecnt, (int)difftime(etime, stime));
  280.    ffwin.SetRemark(buf);
  281.    ffwin.LVfoundfiles.attachList();
  282.    ffwin.started=FALSE;
  283. }
  284.  
  285. // Event-Routinen
  286.  
  287. VOID startEventC::up(WindowC *w, GadgetC *, IntuiMessageC *)
  288. {   _exit = ((FFGUIWindow*)w)->start(); }
  289.  
  290. VOID startEventC::down(WindowC *w, GadgetC *g, IntuiMessageC *i)
  291. {   up(w,g,i); }
  292.  
  293. VOID startEventC::keyUp(WindowC *w, GadgetC *g, IntuiMessageC *i)
  294. {   up(w,g,i); }
  295.  
  296. VOID exitEventC::up(WindowC *w, GadgetC *, IntuiMessageC *)
  297. {   _exit = ((FFGUIWindow*)w)->exit(); }
  298.  
  299. VOID exitEventC::down(WindowC *w, GadgetC *g, IntuiMessageC *i)
  300. {   up(w,g,i); }
  301.  
  302. VOID exitEventC::keyUp(WindowC *w, GadgetC *g, IntuiMessageC *i)
  303. {   up(w,g,i); }
  304.  
  305. SelectWindowCloseC::SelectWindowCloseC(class FFGUIWindow &f) :
  306.    ffwin(f), WindowCloseHandlerC(f) {}
  307. VOID SelectWindowCloseC::close() { _exit = ffwin.exit(); }
  308.  
  309. // Hauptprogramm
  310.  
  311. LibraryBaseErrC IntuitionBase ("intuition.library",   37l);
  312. LibraryBaseErrC UtilityBase   ("utility.library",     37l);
  313. LibraryBaseErrC GadToolsBase  ("gadtools.library",    37l);
  314. LibraryBaseErrC CxBase        ("commodities.library", 37l);
  315. LibraryBaseErrC WorkbenchBase ("workbench.library",   37l);
  316. LibraryBaseErrC LayersBase    ("layers.library",      37l);
  317.  
  318. void main()  {
  319.    PutStr("FindFile 1.0 - © C. Marschner 1995\n\n");
  320.    try {
  321.       ArgsC ac("PATTERN,DIRECTORY");
  322.       char *pat = ac.getStr("PATTERN", "");
  323.       char *dir = ac.getStr("DIRECTORY", "");
  324.       if(pat[0] == 0 || _wbflag == TRUE) {
  325.          // hier folgt die standardmäßig vorgesehene Behandlung
  326.             SignalsC sc;
  327.             GTIDCMPortC gtport;
  328.             sc.add(gtport);
  329.             CtrlCHandlerC ctrlchandler;
  330.             sc.add(ctrlchandler);
  331.             GadgetUpHandlerC gtuphandler;
  332.             gtport.add(gtuphandler);
  333.             PublicScreenC screen();
  334.             screen.lock(NULL);
  335.             FFGUIWindow win(gtport, screen); 
  336.             win.open();
  337.             sc.loop();
  338.       } else {    
  339.          FindFileDOS(dir, pat).ReadRecursively();
  340.       }
  341.    } catch(...) {
  342.       cout << "Fehler aufgetreten\n";
  343.    }
  344. }
  345.